package com.congee02.autocrud.util;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public final class GenericUtils {

    private GenericUtils() {}

    /**
     * 获取一个类的第一个泛型类型的字节码对象
     * @param clazz 一个类的字节码对象
     * @return 第一个泛型类型的字节码对象 ; 若无泛型，返回 null
     *
     */
    public static Class getSingleGenericType(Class<?> clazz) {
        final Class[] allGenericType = getAllGenericType(clazz);
        if (allGenericType.length == 0) {
            return null;
        }
        return allGenericType[0];
    }

    /**
     * 获取一个类的泛型列表
     * @param clazz 一个类的字节码对象
     * @return 所有泛型类型的字节码对象
     */
    public static Class[] getAllGenericType(Class<?> clazz) {
        Type genericSuperclass = clazz.getGenericSuperclass();
        ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;
        Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
        Class[] classes = new Class[actualTypeArguments.length];
        for (int i = 0 ; i < actualTypeArguments.length ; i ++ ) {
            classes[i] = (Class) actualTypeArguments[i];
        }
        return classes;
    }
}
